www.gusucode.com > VC++ 高仿注册表编辑器-源码程序 > VC++ 高仿注册表编辑器-源码程序/code/注册表管理Dlg.cpp
//Download by http://www.NewXing.com // 注册表管理Dlg.cpp : implementation file // #include "stdafx.h" #include "注册表管理.h" #include "注册表管理Dlg.h" #include "SUBCREATE.h" #include "VALUECREATE.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /**************************************************************/ CImageList m_HeadIcon; HKEY hKey; //注册表返回句柄 HKEY MKEY; //用于保存主键 CString FullPath = ""; HTREEITEM SelectNode=NULL; /**************************************************************/ ///////////////////////////////////////////////////////////////////////////// // CMyDlg dialog CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMyDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMyDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) DDX_Control(pDX, IDC_TREE, m_tree); DDX_Control(pDX, IDC_LIST, m_list); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(TVN_SELCHANGING, IDC_TREE/*Cann't be deleted*/, OnSelchangingTree) ON_WM_CONTEXTMENU() ON_COMMAND(ID_MENU_DELETE_SUB, OnMenuDeleteSub) ON_COMMAND(ID_MENU_DELETE_PRO, OnMenuDeletePro) ON_COMMAND(ID_MENU_CREATE_SUBKEY, OnMenuCreateSubkey) ON_COMMAND(ID_MENU_ADD_BINARY, OnMenuAddBinary) ON_COMMAND(ID_MENU_ADD_CHAR, OnMenuAddChar) ON_COMMAND(ID_MENU_ADD_DWORD, OnMenuAddDword) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyDlg message handlers BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); m_list.InsertColumn(0,"名称",LVCFMT_LEFT,120,-1); m_list.InsertColumn(1,"类型",LVCFMT_LEFT,60,-1); m_list.InsertColumn(2,"数据",LVCFMT_LEFT,210,-1); //////添加图标////// m_HeadIcon.Create(16,16,TRUE,2,2); m_HeadIcon.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); m_HeadIcon.Add(AfxGetApp()->LoadIcon(IDI_ICON4)); m_list.SetImageList(&m_HeadIcon,LVSIL_SMALL); //树控件设置 HICON hIcon = NULL; m_ImageList_tree.Create(18, 18, ILC_COLOR16,10, 0); hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 18, 18, 0); m_ImageList_tree.Add(hIcon); hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 32, 32, 0); m_ImageList_tree.Add(hIcon); m_tree.SetImageList ( &m_ImageList_tree,TVSIL_NORMAL ); DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE); dwStyle |=TVS_HASBUTTONS | TVS_HASLINES;// | TVS_LINESATROOT;这里不可一设置这个样式不然ico图表无法显示 SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle); m_hRoot = m_tree.InsertItem("注册表管理",0,0,0,0); HKCU=m_tree.InsertItem("HKEY_CURRENT_USER",1,1,m_hRoot,0); HKLM=m_tree.InsertItem("HKEY_LOCAL_MACHINE",1,1,m_hRoot,0); HKUS=m_tree.InsertItem("HKEY_USERS",1,1,m_hRoot,0); HKCC=m_tree.InsertItem("HKEY_CURRENT_CONFIG",1,1,m_hRoot,0); HKCR=m_tree.InsertItem("HKEY_CLASSES_ROOT",1,1,m_hRoot,0); m_tree.Expand(m_hRoot,TVE_EXPAND); //SetIcon(m_hIcon, TRUE); // Set big icon //SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CMyDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } HCURSOR CMyDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CMyDlg::OnSelchangingTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here TVITEM item = pNMTreeView->itemNew; m_list.DeleteAllItems(); SelectNode=item.hItem; //保存用户打开的子树节点句柄 if(item.hItem == m_hRoot) { return; } HTREEITEM CurrentNode = item.hItem; //取得此节点的全路径 while(m_tree.GetChildItem(CurrentNode)!=NULL) { m_tree.DeleteItem(m_tree.GetChildItem(CurrentNode)); } FullPath = ""; CString Temp; while(CurrentNode != m_hRoot) { Temp = m_tree.GetItemText(CurrentNode); if(Temp.Right(1) != "\\") { Temp += "\\"; } FullPath = Temp + FullPath; CurrentNode = m_tree.GetParentItem(CurrentNode); } GetDlgItem(IDC_STATIC)->SetWindowText(FullPath.LockBuffer()); //设置状态栏 if(!FullPath.Find("HKEY_CLASSES_ROOT")) //判断主键 { MKEY=HKEY_CLASSES_ROOT; FullPath.Delete(0,sizeof("HKEY_CLASSES_ROOT")); }else if(!FullPath.Find("HKEY_CURRENT_USER")) { MKEY=HKEY_CURRENT_USER; FullPath.Delete(0,sizeof("HKEY_CURRENT_USER")); }else if(!FullPath.Find("HKEY_LOCAL_MACHINE")) { MKEY=HKEY_LOCAL_MACHINE; FullPath.Delete(0,sizeof("HKEY_LOCAL_MACHINE")); }else if(!FullPath.Find("HKEY_USERS")) { MKEY=HKEY_USERS; FullPath.Delete(0,sizeof("HKEY_USERS")); }else if(!FullPath.Find("HKEY_CURRENT_CONFIG")) { MKEY=HKEY_CURRENT_CONFIG; FullPath.Delete(0,sizeof("HKEY_CURRENT_CONFIG")); } if(RegOpenKeyEx(MKEY,FullPath.LockBuffer(),0,KEY_ALL_ACCESS,&hKey)==ERROR_SUCCESS)//打开 { char *szValueName; //键值名称 char *szKeyName; //子键名称 LPBYTE szValueDate; //键值数据 DWORD dwIndex=0,NameSize,NameCnt,NameMaxLen,Type; DWORD KeySize,KeyCnt,KeyMaxLen,DateSize,MaxDateLen; if(RegQueryInfoKey(hKey,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS) { AfxMessageBox("RegQueryInfoKey错误"); return; } int nitem=m_list.InsertItem(0,"(默认)",0); m_list.SetItemText(nitem,1,"REG_SZ"); m_list.SetItemText(nitem,2,"(数据未设置)"); for(dwIndex=0;dwIndex<NameCnt;dwIndex++) //枚举键值 { DateSize=MaxDateLen+1; NameSize=NameMaxLen+100; szValueName=(char *)malloc(NameSize); szValueDate=(LPBYTE)malloc(DateSize); RegEnumValue(hKey,dwIndex,szValueName,&NameSize,NULL,&Type,szValueDate,&DateSize);//读取键值 if(Type==REG_SZ) { int nitem=m_list.InsertItem(0,szValueName,0); m_list.SetItemText(nitem,1,"REG_SZ"); m_list.SetItemText(nitem,2,(char*)szValueDate); } if(Type==REG_DWORD) { char ValueDate[256]; sprintf(ValueDate,"%wd",szValueDate); int nitem=m_list.InsertItem(0,szValueName,1); m_list.SetItemText(nitem,1,"REG_DWORD"); m_list.SetItemText(nitem,2,ValueDate); } if(Type==REG_BINARY) { char ValueDate[256]; sprintf(ValueDate,"%wd",szValueDate); int nitem=m_list.InsertItem(0,szValueName,1); m_list.SetItemText(nitem,1,"REG_BINARY"); m_list.SetItemText(nitem,2,ValueDate); } if(Type==REG_EXPAND_SZ) { int nitem=m_list.InsertItem(0,szValueName,0); m_list.SetItemText(nitem,1,"REG_EXPAND_SZ"); m_list.SetItemText(nitem,2,(char*)szValueDate); } } for(dwIndex=0;dwIndex<KeyCnt;dwIndex++) //枚举子键 { KeySize=KeyMaxLen+1; szKeyName=(char*)malloc(KeySize); RegEnumKeyEx(hKey,dwIndex,szKeyName,&KeySize,NULL,NULL,NULL,NULL); m_tree.InsertItem(szKeyName,1,1,SelectNode,0);//插入子键名称 m_tree.Expand(SelectNode,TVE_EXPAND); } RegCloseKey(hKey); } else { AfxMessageBox("打开注册表失败 或者 权限不够"); } *pResult = 0; } void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point) { CMenu menu; menu.LoadMenu(IDR_MENU_POP); CMenu *pop = menu.GetSubMenu(0); POINT ptMouse; GetCursorPos(&ptMouse); pop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,ptMouse.x,ptMouse.y,this); } void CMyDlg::OnMenuDeleteSub() { CString FileBuffer; FileBuffer=CString(TEXT("确实要删除")+FullPath+TEXT("子键吗?")); if(AfxMessageBox(FileBuffer,MB_OKCANCEL,0)==IDOK) { if(ERROR_SUCCESS==RegDeleteKey(MKEY,FullPath.LockBuffer())) { AfxMessageBox("删除成功!"); }else { AfxMessageBox("删除失败!"); } } } void CMyDlg::OnMenuDeletePro() { POSITION pos = m_list.GetFirstSelectedItemPosition(); int currentSelect=m_list.GetNextSelectedItem(pos); if(currentSelect>=0) { CString FileBuffer; //构建确认对话框 FileBuffer=CString(TEXT("确实要删除")+m_list.GetItemText(currentSelect,0)+TEXT("键值项吗?")); if(AfxMessageBox(FileBuffer,MB_OKCANCEL,0)==IDOK) { HKEY key; CString value=m_list.GetItemText(currentSelect,0); //键值 LPCTSTR data=FullPath.LockBuffer(); //路径 ::RegOpenKeyEx(MKEY,data,0,KEY_WRITE,&key); //打开 if(ERROR_SUCCESS==::RegDeleteValue(key,value.LockBuffer())) //删除 { AfxMessageBox("删除成功!"); }else { AfxMessageBox("删除失败!"); } } }else { AfxMessageBox("请选择需要删除的键值项"); } } void CMyDlg::OnMenuCreateSubkey() { SUBCREATE dlg; dlg.SetDate(MKEY,FullPath); dlg.DoModal(); } void CMyDlg::OnMenuAddBinary() { VALUECREATE dlg; dlg.SetDate(MKEY,FullPath); dlg.DoModal(); } void CMyDlg::OnMenuAddChar() { VALUECREATE dlg; dlg.SetDate(MKEY,FullPath); dlg.DoModal(); } void CMyDlg::OnMenuAddDword() { VALUECREATE dlg; dlg.SetDate(MKEY,FullPath); dlg.DoModal(); }